from flask import g
from flask import redirect
from flask import render_template
from flask import url_for

from info.modules.profile import profile_blue

import random
import re
# 2.1 导入蓝图对象
from datetime import datetime

from flask import session

from info import constants, db
from info.lib.yuntongxun.sms import CCP
from info.models import User

# 由全局的 request对象，属性headers 中的请求头，字典类型。
from flask import request, make_response, jsonify
# 导包  生成验证码，图片
from info.utils.captcha.captcha import captcha
# 保存导redis
from info import redis_store
# 请求上下文
from flask import current_app

from info.utils.common import user_login_data
from info.utils.image_storage import storage
from info.utils.response_code import RET


#  ---------------------------------------------------------------------------
# 用户密码修改
# URL：/user/pass_info
# 请求方式：POST
# 传入参数：JSON格式
# 参数:old_password,new_password
# 返回类型：JSON
@profile_blue.route('/pass_info', methods=['GET', 'POST'])
@user_login_data
def pass_info():
    # GET 请求
    if request.method == 'GET':
        return render_template('news/user_pass_info.html')

    # POST 请求
    # 1.获取参数，获取到传入参数
    old_password = request.json.get("old_password")
    new_password = request.json.get("new_password")

    # 2.校验参数
    if not all([old_password, new_password]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误')

    # 3.逻辑处理
    # 3.1获取当前登陆用户信息
    user = g.user

    # 3.2 对比旧密码是否正确
    if not user.check_passowrd(old_password):
        return jsonify(errno=RET.DATAERR, errmsg='原密码输入错误')

    # 3.3 设置新密码,更新数据
    user.password = new_password

    try:
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='数据库错误')

    # 4.返回数据
    return jsonify(errno=RET.OK, errmsg='ok')


#  ---------------------------------------------------------------------------
# 用户头像上传
# URL：/user/pic_info   user_pic_info.html
# 请求方式：POST
# 传入参数：JSON格式
# 参数:avatar
# 返回类型：JSON
@profile_blue.route('/pic_info', methods=['GET', 'POST'])
@user_login_data
def pic_info():

    user = g.user

    # GET 请求
    if request.method == 'GET':
        data = {
            'user': user.to_dict()
        }
        return render_template('news/user_pic_info.html', data=data)

    # POST 设置头像
    # 1.获取图像设置,获取到上传的文件
    try:
        avatar_data = request.files.get('avatar').read()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误，读取文件出错')

    # 2.上传图像到云服务器中（七牛云）
    try:
        avatar_file_name = storage(avatar_data)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR, errmsg='第三方错误，上传图片错误')

    # 3.将文件名存储到数据库中  --> 只需要记录文件名
    # 设置用户模型相关数据
    user.avatar_url = avatar_file_name
    # 将数据保存到数据库
    try:
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='数据库保存用户数据错误')

    # 4.将图像的url地址返回给前端avatar_url
    return jsonify(errno=RET.OK, errmsg='OK', data={"avatar_url ": constants.QINIU_DOMIN_PREFIX + avatar_file_name})


#  ---------------------------------------------------------------------------
# 用户基本资料
# URL：/user/base_info   user_base_info.html
# 请求方式：POST
# 传入参数：JSON格式
# 参数：nick_name，signature，gender
# 返回类型：JSON  errno，errmsg
@profile_blue.route('/base_info', methods=['GET', 'POST'])
@user_login_data
def base_info():
    # 只要能进入该路由，一定是用户登陆了
    # GET请求
    if request.method == 'GET':
        data = {
            'user': g.user.to_dict()
        }

        return render_template('news/user_base_info.html', data=data)

    # POST请求
    # 1.获取参数 nick_name，signature，gender
    nick_name = request.json.get('nick_name')
    signature = request.json.get('signature')
    gender = request.json.get('gender')

    # 2.校验参数
    # 数据完整性
    if not all([nick_name, signature, gender]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不全')

    # 性别选项  性别, MAN / WOMEN
    if gender not in ['MAN', 'WOMEN']:
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误')

    # 3.逻辑处理，设置用户模型的数据
    user = g.user
    user.gender = gender
    user.nick_name = nick_name
    user.signature = signature

    # 保存数据到数据库
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='数据库错误')

    # 将 session 中保存的数据进行实时更新
    session['nick_name'] = nick_name

    # 返回数据
    return jsonify(errno=RET.OK, errmsg='设置成功')


#  ---------------------------------------------------------------------------
# 个人中心设置
@profile_blue.route('/info')
@user_login_data
def user_info():
    # 只需要在这里判断一次用户登陆即可
    # 0.判断用户登陆
    user = g.user
    if not user:
        # 用户未登陆，重定向到首页
        return redirect(url_for('index.index'))
        # return jsonify(errno=RET.SESSIONERR, errmsg='用户未登陆')

    #  获取到当前登录的用户模型,返回模型中指定内容
    data = {
        'user': user.to_dict()
    }

    # 模板渲染
    return render_template('news/user.html', data=data)




